﻿#ifndef CUSTOMLISTITEMDELEGATE_H
#define CUSTOMLISTITEMDELEGATE_H

/*
CustomItemDelegate 是一个继承自 QStyledItemDelegate 的自定义委托类，用于为 Qt 的模型/视图架构提供定制化的项目编辑功能。
这个类的主要目的是控制视图中项目的显示和编辑方式。

类的作用
控制项目编辑行为：决定不同类型的项目使用什么编辑器（如 QComboBox、QSpinBox 等）

管理编辑器创建和销毁：在需要编辑时创建合适的编辑器，编辑完成后销毁

同步模型和编辑器数据：在编辑器和模型之间传输数据

控制编辑器布局：确定编辑器在视图中的位置和大小
*/

#include <QStyledItemDelegate>
#include <QComboBox>
#include <QSpinBox>
#include <QCheckBox>

#include "Public.h"

class CustomListItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit CustomListItemDelegate(QObject *parent = nullptr);
    ~CustomListItemDelegate();

    /**
     * @brief createEditor 创建用于编辑指定索引项目的编辑器控件
     * @param parent    编辑器的父控件
     * @param option    包含渲染项目所需的所有信息和状态
     * @param index     需要编辑的模型索引
     * @return          返回创建的编辑器控件指针
     */
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const override;

    /**
     * @brief setEditorData 设置模型数据
     * @param editor    之前创建的编辑器控件
     * @param index     包含数据的模型索引
     */
    void setEditorData(QWidget *editor, const QModelIndex &index) const override;

    /**
     * @brief setModelData  将编辑器中的数据保存回模型
     * @param editor    包含编辑后数据的编辑器控件
     * @param model     需要更新的模型
     * @param index     需要更新的模型索引
     */
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const override;

    /**
     * @brief updateEditorGeometry 更新编辑器的几何属性（位置和大小）
     * @param editor    需要定位的编辑器控件
     * @param option    包含项目布局信息的选项
     * @param index     模型索引
     */
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
                              const QModelIndex &index) const override;

};

#endif // CUSTOMLISTITEMDELEGATE_H
